
package logica.DAO;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import objetosNegocio.ListaUsuarios;
import objetosNegocio.TipoUsuario;
import objetosNegocio.Usuario;


public class DAOUsuario implements InterfazDAOUsuario {

	private DAOConnection connection; //Conexion a BBDD
	
	/**
	 * @param connection - Objeto que encapsula la conexion a la bbdd
	 */
	public DAOUsuario(DAOConnection connection){
		this.connection = connection;
	}
	
	@Override
	public boolean insertarRegistro(Usuario datos) throws SQLException {
		boolean insertado = false;
		Statement stmt = null;
		
		String sentenciaSQL = "";  		//Siempre se inserta el usuario como activo (valor 0), la pass se cifra a md5
		sentenciaSQL = "INSERT INTO gesal.Usuario (idUsuario,alias,activo,password,tipoUsuario,almacen,nombre,apellidos,"
						+ "email,telefono) VALUES (NULL,'" + datos.getAlias() + "',0," 
						+ "MD5('" + datos.getPassword() + "')," + datos.getTipoUsuario().ordinal() + "," + datos.getAlmacen() 
						+ ",'" + datos.getNombre() + "','" + datos.getApellidos() + "','" + datos.getEmail()
						+ "','" + datos.getTelefono() + "')";
				
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) insertado=true;
		stmt.close();
		
		return insertado;
	}

	@Override
	public boolean modificarRegistro(Usuario datos) throws SQLException {
		boolean modificado = false;
		Statement stmt = null;
		
		int activo = datos.getActivo()? 0 : 1; //Pasamos de boolean a int

		String sentenciaSQL = "";
		sentenciaSQL = "UPDATE gesal.Usuario SET " +
						"alias='" + datos.getAlias() + "', " +
						"activo=" + activo + ", ";
		
		//Si se introduce un valor en el campo password, esta se actualiza
		if (!datos.getPassword().equalsIgnoreCase(""))
			sentenciaSQL+= "password=MD5('" + datos.getPassword() + "'), "; 
		
		sentenciaSQL+=  "tipoUsuario=" + datos.getTipoUsuario().ordinal() + ", " +
						"almacen=" + datos.getAlmacen() + ", " +
						"nombre='" + datos.getNombre() + "', "+ 
						"apellidos='" + datos.getApellidos()+ "', " +
						"email='" + datos.getEmail() + "', " +
						"telefono='" + datos.getTelefono()+ "' " +
						"WHERE idUsuario=" + datos.getId();
		
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) modificado=true;
		stmt.close();
		
		return modificado;
	}

	@Override
	public boolean bajaRegistro(int codigo) throws SQLException {
		boolean baja = false;
		Statement stmt = null;
		
		String sentenciaSQL = "";
		sentenciaSQL = "UPDATE gesal.Usuario SET activo=1 WHERE idUsuario=" + codigo;
		
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) baja=true;
		stmt.close();

		return baja;
	}

	@Override
	public Usuario obtenerRegistro(int codigo) throws SQLException {
		ResultSet resul = null;
		Statement stmt = null;
		Usuario datos = null;
		
		//No se recupera la password
		String sentenciaSQL = "";
		sentenciaSQL = 	"SELECT idUsuario,alias,activo,tipoUsuario,almacen,nombre,apellidos,email,telefono " +
						"FROM gesal.Usuario WHERE idUsuario=" + codigo;
		
		stmt = connection.getConnection().createStatement();
		resul = stmt.executeQuery(sentenciaSQL);
		
		//Si se encuentra el registro se tratan los datos
		if (resul.next()){  
			datos= new Usuario();	
			datos.setId(resul.getInt("idUsuario"));
			datos.setAlias(resul.getString("alias"));
			datos.setActivo((resul.getInt("activo")==0));
			datos.setPassword("");
			datos.setTipoUsuario(TipoUsuario.values()[resul.getInt("tipoUsuario")]);
			datos.setAlmacen(resul.getInt("almacen"));
			datos.setNombre(resul.getString("nombre"));
			datos.setApellidos(resul.getString("apellidos"));
			datos.setEmail(resul.getString("email"));
			datos.setTelefono(resul.getString("telefono"));
		}
		
		resul.close();
		stmt.close();

		return datos;	
	}

	@Override
	public ListaUsuarios obtenerListaRegistros() throws SQLException {
		return obtenerListado(false);
	}

	@Override
	public ListaUsuarios obtenerListaRegistrosActivos() throws SQLException {
		return obtenerListado(true);
	}

	
	private ListaUsuarios obtenerListado(boolean soloActivos) throws SQLException{
		ResultSet resul = null;
		Statement stmt = null;
		
		Usuario datos = null;
		ListaUsuarios listado = new ListaUsuarios();
		
		String sentenciaSQL = "";
		sentenciaSQL = "SELECT idUsuario,alias,activo,tipoUsuario,almacen,nombre,apellidos,email,telefono FROM gesal.Usuario";
		
		if (soloActivos)
			sentenciaSQL+= " WHERE activo=0";
		
		stmt = connection.getConnection().createStatement();
		resul = stmt.executeQuery(sentenciaSQL);
		
		
		//Si se encuentra el registro se tratan los datos
		while (resul.next()){  
			datos= new Usuario();	
			datos.setId(resul.getInt("idUsuario"));
			datos.setAlias(resul.getString("alias"));
			datos.setActivo((resul.getInt("activo")==0));
			datos.setPassword("");
			datos.setTipoUsuario(TipoUsuario.values()[resul.getInt("tipoUsuario")]);
			datos.setAlmacen(resul.getInt("almacen"));
			datos.setNombre(resul.getString("nombre"));
			datos.setApellidos(resul.getString("apellidos"));
			datos.setEmail(resul.getString("email"));
			datos.setTelefono(resul.getString("telefono"));
			listado.add(datos);
		}
		
		resul.close();
		stmt.close();
		return listado;
	}
	
	@Override
	public boolean modificarPassword(String aliasUsuario, String password) throws SQLException {
		boolean update = false;
		Statement stmt = null;
		
		String sentenciaSQL = "";
		sentenciaSQL = "UPDATE gesal.Usuario SET password=MD5('"+ password +"') WHERE alias='" + aliasUsuario + "'";
		
		stmt = connection.getConnection().createStatement();
		if ((stmt.executeUpdate(sentenciaSQL))==1) update=true;
		stmt.close();

		return update;
	}

	@Override
	public boolean validarPassword(String aliasUsuario, String password) throws SQLException {
		boolean coincide = false;
		ResultSet resul = null;
		Statement stmt = null;
		
		String sentenciaSQL = "SELECT password,MD5('" + password + "') AS passValidar FROM gesal.Usuario WHERE alias='" + aliasUsuario + "'";
		
		stmt = connection.getConnection().createStatement();
		resul = stmt.executeQuery(sentenciaSQL);
		
		//Si se encuentra el registro se tratan los datos
		if (resul.next()){
			if (resul.getString("password").equals(resul.getString("passValidar")))
				coincide=true;
		}
		
		resul.close();
		stmt.close();

		return coincide;
	}

}